//package xin.xueqing.base.config.mybatisplus;
//
//import lombok.extern.log4j.Log4j2;
//import org.apache.ibatis.cache.Cache;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.data.redis.connection.RedisServerCommands;
//import org.springframework.data.redis.core.RedisCallback;
//import org.springframework.data.redis.core.RedisTemplate;
//import org.springframework.util.CollectionUtils;
//import ApplicationContextHolder;
//
//import javax.annotation.Resource;
//import java.util.Set;
//import java.util.concurrent.locks.ReadWriteLock;
//import java.util.concurrent.locks.ReentrantReadWriteLock;
//
///**
// * @author: xueqing wang
// * @date: 2021/3/25
// * @description:
// **/
//@Log4j2
//public class MybatisRedisCache implements Cache {
//
//
//    // 读写锁
//    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock(true);
//
//    //这里使用了redis缓存，使用springboot自动注入
//    @Resource(name = "redisTemplateCache")
//    private RedisTemplate<String, Object> redisTemplateCache;
//
//    private String id;
//
//    public MybatisRedisCache(final String id) {
//        if (id == null) {
//            throw new IllegalArgumentException("Cache instances require an ID");
//        }
//        this.id = id;
//    }
//
//    @Override
//    public String getId() {
//        return this.id;
//    }
//
//    @SuppressWarnings("all")
//    @Override
//    public void putObject(Object key, Object value) {
//
//        if (redisTemplateCache == null) {
//            redisTemplateCache = (RedisTemplate<String, Object>) ApplicationContextHolder.getApplicationContext().getBean("redisTemplateCache");
//        }
//        if (value != null) {
//            redisTemplateCache.opsForValue().set(key.toString(), value);
//        }
//    }
//    @SuppressWarnings("all")
//    @Override
//    public Object getObject(Object key) {
//        try {
//            if (redisTemplateCache == null) {
//                redisTemplateCache = (RedisTemplate<String, Object>) ApplicationContextHolder.getApplicationContext().getBean("redisTemplateCache");
//            }
//            if (key != null) {
//                return redisTemplateCache.opsForValue().get(key.toString());
//            }
//        } catch (Exception e) {
//            log.error("缓存出错 ");
//        }
//        return null;
//    }
//    @SuppressWarnings("all")
//    @Override
//    public Object removeObject(Object key) {
//        if (redisTemplateCache == null) {
//            redisTemplateCache = (RedisTemplate<String, Object>) ApplicationContextHolder.getApplicationContext().getBean("redisTemplateCache");
//        }
//        if (key != null) {
//            redisTemplateCache.delete(key.toString());
//        }
//        return null;
//    }
//
//    @SuppressWarnings("all")
//    @Override
//    public void clear() {
//        log.debug("清空缓存");
//        if (redisTemplateCache == null) {
//            redisTemplateCache = (RedisTemplate<String, Object>) ApplicationContextHolder.getApplicationContext().getBean("redisTemplateCache");
//        }
//        Set<String> keys = redisTemplateCache.keys("*:" + this.id + "*");
//        if (!CollectionUtils.isEmpty(keys)) {
//            redisTemplateCache.delete(keys);
//        }
//    }
//
//    @Override
//    public int getSize() {
//        Long size = redisTemplateCache.execute((RedisCallback<Long>) RedisServerCommands::dbSize);
//        return size.intValue();
//    }
//
//    @Override
//    public ReadWriteLock getReadWriteLock() {
//        return this.readWriteLock;
//    }
//}
